package luke.media.video;

import luke.system.callback.ProgressCallback;


import java.awt.*;

import java.util.List;

/**
 * 频谱视频生成器基类，提供所有频谱视频生成器共用的功能
 * 视频渲染器只负责根据频带能量画图、画播放列表和抬头时间，生成没有音频的视频
 *
 * ==================== 重要说明 ====================
 * 此类及其子类为频谱视频渲染器，职责必须单一：
 * 1. 不应该区分分段模式还是单独模式
 * 2. 不应该有任何与分段处理相关的逻辑
 * 3. 不应该处理音频叠加
 * 4. 只负责根据频带能量画图、画播放列表和抬头时间
 * 5. 生成没有音频的视频
 * =================================================
 */
public abstract class BaseSpectrumVideoGenerator {
    protected String outputVideoPath;
    protected int width;
    protected int height;
    protected List<String> playlistContent; // 播放列表内容
    protected int totalFrames; // 视频总帧数
    protected double fps; // 视频帧率
    protected String videoTitle; // 视频标题
    protected double[][] precomputedSpectrums; // 预计算的频谱数据
    protected int requiredBarCount; // 所需频段数量

    /**
     * 构造函数 - 简化版本，只保留必要参数
     * 
     * @param outputVideoPath 输出视频路径
     * @param width 视频宽度
     * @param height 视频高度
     * @param playlistContent 播放列表内容
     * @param videoTitle 视频标题
     * @param fps 视频帧率（由调度器传入）
     * @param requiredBarCount 所需频段数量（由调度器传入）
     */
    public BaseSpectrumVideoGenerator(String outputVideoPath, 
                                     int width, 
                                     int height, 
                                     List<String> playlistContent, 
                                     String videoTitle,
                                     double fps,
                                     int requiredBarCount) {
        this.outputVideoPath = outputVideoPath;
        this.width = width;
        this.height = height;
        this.playlistContent = playlistContent != null ? playlistContent : java.util.Collections.emptyList();
        this.videoTitle = videoTitle != null && !videoTitle.isEmpty() ? videoTitle : "播放列表";
        this.precomputedSpectrums = null;
        this.totalFrames = 0;
        this.fps = fps; // 由调度器传入帧率
        this.requiredBarCount = requiredBarCount; // 由调度器传入频段数量
    }

    /**
     * 获取所需频段数量（用于分段处理）
     * @return 频段数量
     */
    public int getRequiredBarCount() {
        return this.requiredBarCount;
    }
    
    /**
     * 设置预计算的频谱数据
     * @param spectrums 预计算的频谱数据
     */
    public void setPrecomputedSpectrums(double[][] spectrums) {
        this.precomputedSpectrums = spectrums;
    }

    /**
     * 生成视频
     * @param durationMs 视频总时长（毫秒）
     * @param progressCallback 进度回调
     * @return 生成成功返回true，失败返回false
     */
    public abstract boolean generateVideo(long durationMs, ProgressCallback progressCallback);

    /**
     * 绘制时间信息
     * @param g2d Graphics2D对象
     * @param currentTime 当前时间（秒）
     */
    protected void drawTimeInfo(Graphics2D g2d, double currentTime) {
        VideoUIUtils.drawTimeInfo(g2d, currentTime, width, height);
    }

    /**
     * 绘制播放列表
     * @param g2d Graphics2D对象
     */
    protected void drawPlaylist(Graphics2D g2d) {
        VideoUIUtils.drawPlaylist(g2d, playlistContent, width, height, this.videoTitle);
    }

    /**
     * 根据基础颜色生成边框颜色
     * @param baseColor 基础颜色
     * @return 边框颜色
     */
    protected Color getBorderColor(Color baseColor) {
        return VideoUIUtils.getBorderColor(baseColor);
    }

    /**
     * 根据基础颜色生成高光颜色
     * @param baseColor 基础颜色
     * @return 高光颜色
     */
    protected Color getHighlightColor(Color baseColor) {
        return VideoUIUtils.getHighlightColor(baseColor);
    }

    /**
     * 根据频率比例生成蓝紫色渐变颜色
     * @param frequencyRatio 频率比例（0.0-1.0）
     * @return 对应的蓝紫色渐变颜色
     */
    protected Color getBluePurpleColor(float frequencyRatio) {
        return VideoUIUtils.getBluePurpleColor(frequencyRatio);
    }

    /**
     * 截断文本并在末尾添加省略号
     * @param text 原始文本
     * @param fm 字体度量
     * @param maxWidth 最大宽度
     * @return 截断后的文本
     */
    protected String truncateText(String text, FontMetrics fm, int maxWidth) {
        return VideoUIUtils.truncateText(text, fm, maxWidth);
    }
}